package generator.gridgain;

import generator.Gridifier;
import generator.WritebleClass;

import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * Esta clase genera código gridificable para el middleware GridGain sobre
 * archivos fuente de java que respetan las convenciones JGrim. Es por ello que
 * implementa la interface {@link Gridifier} que el generador de código
 * gridificable exige.
 * 
 * @uml.dependency supplier="generator.gridgain.PeerClassBuilder"
 * @uml.dependency supplier="generator.Gridifier"
 */
public class GridGainGridifier implements Gridifier {

	/** Constructor vacío de la clase */
	public GridGainGridifier() {

	}

	/**
	 * Gridifica los métodos pertenecientes a una clase con convenciones JGRIM 
	 * para permitir su ejecución en el middleware GridGain.
	 * 
	 * @param classToGridify
	 *            indica la clase que contiene los métodos que serán
	 *            gridificados
	 * @param methodsToGridifyIF
	 *            representa una interface que describe la signaturas de los
	 *            métodos que serán gridificados cuya implementación se
	 *            encuentra en <B>classToGridify</B>
	 * @return java.util.List&ltWritebleClass&gt que contiene el conjunto de clases que
	 * 		   permiten la ejecución de los métodos de la clase <B>classToGridify</B>
	 *         sobre un grid de GridGain.
	 */
	public List<WritebleClass> gridify(Object classToGridify, Object methodsToGridifyIF) {

		List<WritebleClass> retDocs = new ArrayList<WritebleClass>();

		NodeList methods = ((Document) methodsToGridifyIF).getElementsByTagName("method");

		for (int i = 0; i < methods.getLength(); i++) {
			Element method = (Element) methods.item(i);
			GridExecutorJobBuilder gEJB = new GridExecutorJobBuilder((Document) classToGridify, method);
			GridExecutorResultBuilder gERB = new GridExecutorResultBuilder((Document) classToGridify, method);
			retDocs.add(new DocumentWrapper(gEJB.build()));
			retDocs.add(new DocumentWrapper(gERB.build()));
		}
		PeerClassBuilder pcb = new PeerClassBuilder((Document) classToGridify,methods);
		retDocs.add(new DocumentWrapper(pcb.build()));

		return retDocs;
	}

}
